#include "video.h"
#include "kasm.h"
#include "defs.h"
#include "kc.h"

char * video = (char *) VIDEO;
int screen_pos = 0;
int r_screen_pos = (CHAT_LINE+2) * (CANT_COLS * VID_CHAR);
int prompt_pos;


void
BlankLine(int line)
{
	int i, aux;
	FD fd;
	
	aux= screen_pos;		/* back up del screen pos */
	if( line > 24 || line < 0 )
		return;
	screen_pos= line* CANT_COLS * VID_CHAR;
	for(i = 0; i < CANT_COLS; i++)			/* Imprime una linea en blanco */
		putChar(' ');
	screen_pos= aux;		/* Vuelve a dejar la screen pos donde la encontro */
	return;	
}

void
BlankScreen (void)
{
	int i;

/* hago clear de la pantalla, borrando linea por linea */
	for  (i=0;i<CANT_ROWS;i++)
		BlankLine (i);
	return ;
}

void putChar(unsigned char c)
{
	writeWrapper(&c, 1);
}

void
printWelcome(void)
{
	static char st[] = "Gracias por usar ChatS OS v0.1c!";

	/*Imprimo mensaje de bienvenida*/
	screen_pos= 22*VID_CHAR;
	writeWrapper(st, strLen(st));
	carrReturn();
	carrReturn();
}

void
printPrompt(void)
{
	static char st[] = "$> ";

	/*Imprimo el prompt*/
	writeWrapper(st, 3);
}

void
myprint(char * string, int carr)
{
	if( carr )
		carrReturn();
	while( *string != '\0' )
		putChar(*string++);
	return;
}

void
carrReturn()
{
	putChar('\n');
	return;
}

void
printHelp(void)
{
	static char help1[] = "ChatS, version 0.1c";
	static char help2[] = "Modo de uso: 'chat' para comenzar el chat"
						  " por puerto serie.";
	static char help3[] = "Modo de uso: 'clear' para borrar la pantalla.";
	static char help4[] = "Modo de uso: 'reboot' para reiniciar el sistema.";
	static char help5[] = "Modo de uso: 'help' para obtener ayuda.";

/* Imprimo el mensaje de ayuda */
	myprint(help1, 1);
	carrReturn();
	myprint(help2, 1);
	carrReturn();
	myprint(help3, 1);
	carrReturn();
	myprint(help4, 1);
	carrReturn();
	myprint(help5, 1);
	carrReturn();
	return;
}

void SetCursor(int screen_pos)		/* screen_pos= -1: borro cursor
									 * screen_pos= -2: restauro cursor */
{
    u16int cursor = screen_pos/2;

	if( screen_pos >= 0 )
	{
		// Preparo para setear el byte alto del cursor.
		asm volatile ("outb %1, %0" : : "dN" ((u16int)0x3D4), 
						"a" ((u8int)14));
		// Seteo el byte alto del cursor.
		asm volatile ("outb %1, %0" : : "dN" ((u16int)0x3D5), 
						"a" ((u8int)(cursor >> 8)));
		// Preparo para setear el byte bajo del cursor.
		asm volatile ("outb %1, %0" : : "dN" ((u16int)0x3D4), 
						"a" ((u8int)15));
		// Seteo el byte bajo del cursor.
		asm volatile ("outb %1, %0" : : "dN" ((u16int)0x3D5), 
						"a" ((u8int)cursor));
	}
	else if( screen_pos == -1 )
		_DelCursor();
	else if( screen_pos == -2 )
		_RestoreCursor();
}

void
cls(void)
{
	BlankScreen();
	screen_pos= 0;
	return;
}
